import { loginAPI, userInfoAPI, profileAPI } from '@/api/user'
import { setToken, getToken, removeToken } from '@/utils/auth'
import router, {resetRouter} from '@/router'
const getDefaultState = () => {
  return {
    // token
    token: getToken(),
    // 用户信息
    userInfo: {}
  }
}

const state = getDefaultState()

const mutations = {
  setToken(state, token) {
    // 存到vuex
    state.token = token
    // 存到本地
    setToken(token)
  },

  // 用来修改用户信息的方法
  setUserInfo (state, obj) {
    state.userInfo = obj
  },
}

const actions = {
  async login(ctx, obj) {
    try {
      const res = await loginAPI(obj)
      // 调用mutations
      ctx.commit('setToken', res.data)
      router.push('/')
    } catch (err) {
      return Promise.reject(err)
    }
  },

    // 发请求获取用户信息
    async reqUserInfo (ctx) {
      // 先请求基本资料
      const res = await userInfoAPI()
      // 再请求其他资料
      const res2 = await profileAPI(res.data.userId)
      // 这是代表把res和res2的所有属性都放到一个新的对象里
      // 再把新的对象放到vuex里存储
      ctx.commit('setUserInfo', {
        ...res.data,
        ...res2.data
      })
      // 返回这个用户拥有的页面权限
      return res.data.roles.menus
    },

  // 退出的点击事件
  logout ( { commit, dispatch } ) {
    // 给空字符串相当于就是清空删除了
    commit('setToken', '')
    // 还要清空userInfo
    commit('setUserInfo', {})
    // 删除保存的时间戳
    removeToken()
    // 重置路由表
    resetRouter()
    // 调用tagsView模块里的actions-delAllViews
    // 参数1：方法名
    // 参数2：传递的额外参数，不想传给个null
    // 参数3：传入一个对象，对象里可以写一个 root:true，这个意思就是指从根store里找到tagsView/dellAllViews
    // 如果我在某个vuex模块里要调用别的模块里的方法，默认不支持
    // 因为默认只能调用自己模块的。如果非要调别的模块的，就加 { root: true },代表从根store调用
    dispatch('tagsView/delAllViews', null, { root: true } )
  }
}

export default {
  namespaced: true,
  state,
  mutations,
  actions
}
